﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AG.Modulos.AdministracionTaquilla.Contratos;
using AG.Comunes.Entidades;
using System.Web.UI.WebControls;
using System.Data;
using System.Configuration;

namespace AG.Modulos.AdministracionTaquilla.Presentadores
{
    public class PresentadorGestionarProducto
    {

        #region Atributos

        private IGestionarProducto _vista;
        private ControladorAdministracionTaquilla _controlador;

        #endregion

        #region Constructores

        /// <summary>
        /// Es el constructor principal del presentador
        /// </summary>
        /// <param name="vista">es el contrato que tiene la vista con el presentador</param>
        public PresentadorGestionarProducto(IGestionarProducto vista)
        {
            _vista = vista;
            _controlador = new ControladorAdministracionTaquilla();
        }

        #endregion

        #region Metodos Publicos


        /// <summary>
        /// Metodo que envia el objeto hacia el controlador
        /// </summary>
        public void Aceptar()
        {
            bool retorno;
            try
            {

                Producto producto = new Producto();
                producto = LlenarProducto(producto);
                retorno = _controlador.GuardarProducto(producto);
                if (retorno)
                {
                    _vista.ProductoImagen.SaveAs(ConfigurationManager.AppSettings[@"rutaImagenProductoGuardar"] + _vista.ProductoImagen.FileName);
                     System.Windows.Forms.MessageBox.Show(ConfigurationManager.AppSettings[@"OperacionExitosa"]);
                }

            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ConfigurationManager.AppSettings[@"Error"] + ex.Message.ToString());
            } 
        }

        /// <summary>
        /// Metodo que carga los objetos de la ventana de modificacion
        /// </summary>
        public void IrConsultarProductos()
        {
            try
            {

                _vista.SessionListaDeProductos = _controlador.ObtenerTodosLosProductos();
                if (_vista.StatusProductoDDL.SelectedItem.ToString() == ConfigurationManager.AppSettings[@"StatusTodoslosProductos"])
                    _vista.ListaProductos.DataSource = _vista.SessionListaDeProductos;
                else
                    _vista.ListaProductos.DataSource = _controlador.FiltrarDataSet(_vista.SessionListaDeProductos,
                                                                  _vista.StatusProductoDDL.SelectedValue,
                                                                  ConfigurationManager.AppSettings[@"DLLStatusProductosCampoValor"]);
                AjustarTamanoGridView();
                _vista.ListaProductos.DataBind();
            }
            catch
            {
                throw;
            }
        }

        /// <summary>
        /// metodo que realiza la carga en pantalla de los datos del producto seleccionado
        /// </summary>
        public void CargarStatusProductos()
        {
            try
            {
                //Carga ddl para Consulta
                _vista.StatusProductoDDL.DataSource = _controlador.ConsultarListaDeValoresDeDominio(ConfigurationManager.AppSettings[@"StatusProductos"]);
                _vista.StatusProductoDDL.DataValueField = ConfigurationManager.AppSettings[@"DDLStatusProductosValue"];
                _vista.StatusProductoDDL.DataTextField = ConfigurationManager.AppSettings[@"DDLStatusProductosText"];
                _vista.StatusProductoDDL.DataBind();

                //carga ddl para modificar
                _vista.StatusProductoDDLAModificar.DataSource = _vista.StatusProductoDDL.DataSource;
                _vista.StatusProductoDDLAModificar.DataValueField = ConfigurationManager.AppSettings[@"DDLStatusProductosValue"];
                _vista.StatusProductoDDLAModificar.DataTextField = ConfigurationManager.AppSettings[@"DDLStatusProductosText"];
                _vista.StatusProductoDDLAModificar.DataBind();
            }
            catch
            {
                throw;
            }
        }

        /// <summary>
        /// metodo encargado de filtrar el gridView dado el cambio de status
        /// </summary>
        public void FiltrarListaDeProductosPorStatus()
        {
            try
            {
                //Se filtra dado el status
                if (_vista.StatusProductoDDL.SelectedItem.ToString() != ConfigurationManager.AppSettings[@"StatusTodoslosProductos"])
                     _vista.ListaProductos.DataSource = _controlador.FiltrarDataSet(_vista.SessionListaDeProductos,
                                                                 _vista.StatusProductoDDL.SelectedValue,
                                                                ConfigurationManager.AppSettings[@"DLLStatusProductosCampoValor"]);
                else
                    _vista.ListaProductos.DataSource = _vista.SessionListaDeProductos;

                AjustarTamanoGridView();
                _vista.ListaProductos.DataBind();
            }
            catch
            {
                throw;
            }
        }


        //Metodo que ajusta el tamao de las imagenes del gridView
        public void AjustarTamanoGridView()
        {
            _vista.ListaProductos.Columns[1].ControlStyle.Width = new Unit(ConfigurationManager.AppSettings[@"TamanoImagenGridView"]);
            _vista.ListaProductos.Columns[1].ControlStyle.Height = new Unit(ConfigurationManager.AppSettings[@"TamanoImagenGridView"]);
        }

        /// <summary>
        /// Metodo que carga los datos del producto para ser modificado
        /// </summary>
        public void IrModificarProducto(string valor)
        {
            try
            {
                DataRow[] filaProducto = _vista.SessionListaDeProductos.Tables[0].Select("ID_PRODUCTO = '" + int.Parse(valor) + "'");
                CargarProductoModificar(filaProducto);
                _vista.StatusProductoDDLAModificar.SelectedIndex = (int)filaProducto[0]["NUM_STATUS"];
                _vista.StatusProductoDDLAModificar.DataBind();
            }
            catch
            {
                throw;
            }
        }


        public void Modificar()
        {
            try
            {
                bool respuesta; 
                Producto producto = new Producto();
                producto = LlenarProductoAModificar((Producto)_vista.SessionDeProducto);
                if (!_controlador.ModificarProducto(producto))
                    System.Windows.Forms.MessageBox.Show(ConfigurationManager.AppSettings[@"ErrorModificacion"]);
                else
                {
                    System.Windows.Forms.MessageBox.Show(ConfigurationManager.AppSettings[@"OperacionExitosa"]);
                }
            }
            catch
            {
                throw;
            }
        }

        #endregion

        #region Metodos Privados

        /// <summary>
        /// Funcion encargada de llenar el objeto con los datos sumistrados en la pantalla
        /// </summary>
        /// <param name="producto">producto a llenar</param>
        /// <returns></returns>
        private Producto LlenarProducto(Producto producto)
        {
            
            try
            {
                producto.nombre = _vista.Nombre;
                producto.Descripcion = _vista.Descripcion;
                producto.CantidadTickets = int.Parse(_vista.ValordTicketsDelProducto);
                producto.CantidadProductos = int.Parse(_vista.CantidadDeProductos);
                producto.Imagen = new Imagen();
                producto.Imagen.Url = ConfigurationManager.AppSettings[@"rutaImagenProducto"] + _vista.ProductoImagen.FileName;
                
            }
            catch
            {
                throw;
            }
            return producto;
        }

        /// <summary>
        /// Funcion encargada de llenar el objeto con los datos sumistrados en la pantalla
        /// </summary>
        /// <param name="productoSesion">producto de sesion</param>
        /// <returns></returns>
        private Producto LlenarProductoAModificar(Producto productoSesion)
        {


            Producto producto = new Producto();
            producto.Imagen = new Imagen();
            producto.Status = new int();
            
            try
            {
                producto.nombre = _vista.NombreAModificar;
                producto.Descripcion = _vista.DescripcionAModificar;
                producto.CantidadTickets = int.Parse(_vista.ValordTicketsDelProductoAModificar);
                producto.CantidadProductos  = int.Parse(_vista.CantidadDeProductosAModificar);
                producto.TotalCanjeados =   int.Parse(_vista.CantidadProductosCanjeados);
                producto.Status = int.Parse(_vista.StatusProductoDDLAModificar.SelectedValue);
                producto.Imagen.Url = productoSesion.Imagen.Url;
                producto.Id = productoSesion.Id;
                producto.Fecha = productoSesion.Fecha;


            }
            catch
            {
                throw;
            }
            return producto;
        }

 
        /// <summary>
        /// Metodo cara los textbox de la pantalla de modigicar
        /// </summary>
        /// <param name="filaProducto"> fila de datos del producto</param>
        /// <returns></returns>
        private void CargarProductoModificar(DataRow[] filaProducto)
        {


            try
            {
                Producto producto =new Producto();
                producto.Imagen = new Imagen();
                producto.Status = new int();
               producto.nombre  = _vista.NombreAModificar = filaProducto[0]["X_NOMBRE"].ToString();
               producto.Descripcion = _vista.DescripcionAModificar = filaProducto[0]["T_DESCRIPCION"].ToString();
               _vista.ValordTicketsDelProductoAModificar = filaProducto[0]["NUM_VALORTICKET"].ToString();
               _vista.CantidadDeProductosAModificar = filaProducto[0]["NUM_CANTIDAD"].ToString();
               _vista.CantidadProductosCanjeados = filaProducto[0]["NUM_TOTALCANJEADOS"].ToString();
               _vista.ImagenModificar.ImageUrl = filaProducto[0]["X_IMAGEN"].ToString();
                //Se asignan estos valores a la variable de sesion
                producto.Id = (int)filaProducto[0]["ID_PRODUCTO"];
                producto.CantidadTickets = (int)filaProducto[0]["NUM_VALORTICKET"];
                producto.TotalCanjeados = (int)filaProducto[0]["NUM_TOTALCANJEADOS"];
                producto.Fecha = DateTime.Parse(filaProducto[0]["D_FECHA"].ToString());
                producto.CantidadProductos = (int)filaProducto[0]["NUM_CANTIDAD"];
                producto.Imagen.Url = filaProducto[0]["X_IMAGEN"].ToString();
                producto.Status = (int)filaProducto[0]["NUM_STATUS"];

                _vista.SessionDeProducto = producto;

            }
            catch
            {
                throw;
            }
        }


        #endregion


    }
}
